package com.example.function.integration.sftp;

import com.example.function.integration.utils.SftpUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.URL;

import static com.example.function.integration.utils.SftpUtil.buildSftpUtil;

/**
 * @description:初始化SFTP实例
 * @className:CommonSftpComponent
 * @author:ext.fengcheng
 * @date:2023/9/19 16:09
 */
@Data
@Component
public class CommonSftpComponent implements InitializingBean {
    @Value("${sftp.host}")
    private String host;
    @Value("${sftp.port}")
    private String port;
    @Value("${sftp.username}")
    private String username;
    @Value("${sftp.password}")
    private String password;
    @Value("${sftp.privateKeyFile}")
    private String privateKeyFile;
    public static String remoteFilePath;

    // sftp 工具类实体对象
    public SftpUtil sftpUtil = null;

    protected static Logger logger = LoggerFactory.getLogger(CommonSftpComponent.class);

    @Value("${sftp.remoteFilePath}")
    public void setRemoteFilePath(String remoteFilePath) {
        CommonSftpComponent.remoteFilePath = remoteFilePath;
    }

    /**
     * @Description：在加载这个类的最后初始化此方法
     * @Author： ext.fengcheng
     * @Date：2023/9/27 16:03
     * @Param： []
     * @Return： void
     */
    @Override
    public void afterPropertiesSet() {
        /*try {
            logger.info("初始化SFTP实体对象");
            CrlSftpVo crlSftp = new CrlSftpVo();
            crlSftp.setHost(getHost());
            crlSftp.setPort(Integer.parseInt(getPort()));
            crlSftp.setUsername(getUsername());
            crlSftp.setPassword(getPassword());
            crlSftp.setPrivateKeyFile(getPrivateKeyFile());
            sftpUtil = SftpUtil.buildSftpUtil(crlSftp);
            logger.info("初始化SFTP实体对象，完成");
        } catch (JSchException e) {
            logger.error("初始化SFTP实体对象发生异常：{}", e.getMessage(), e);
            throw new RuntimeException(e);
        }*/
    }

    /**
     * @Description：初始化SFTP连接
     * @Author： ext.fengcheng
     * @Date：2023/10/11 11:16
     * @Param： []
     * @Return： void
     */
    public SftpUtil initSftpConnection() {
        SftpUtil sftp = null;
        try {
            logger.info("初始化SFTP实体对象");
            int port = Integer.parseInt(getPort());
            if (StringUtils.isNotBlank(getPassword())) { //密码形式构造
                sftp = new SftpUtil(getHost(), getUsername(), getPassword(), port, "");
            } else if (StringUtils.isNotBlank(getPrivateKeyFile())) { //私钥形式构造
                URL url = SftpUtil.class.getClassLoader().getResource(getPrivateKeyFile());
                if (url == null) {
                    throw new NullPointerException("获取私钥文件失败,请检查是否在类路径下配置私钥文件");
                }
                String authKey = url.getPath();
                sftp = new SftpUtil(getUsername(), authKey, getHost(), port);
            } else {
                throw new RuntimeException("构造sftp连接对象失败,密码和私钥不能同时为空.");
            }
            logger.info("初始化SFTP实体对象，完成");
            return sftp;
        } catch (Exception e) {
            logger.error("初始化SFTP实体对象发生异常：{}", e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description：初始化SFTP连接
     * @Author： ext.fengcheng
     * @Date：2023/10/11 11:16
     * @Param： []
     * @Return： void
     */
    public SftpUtil initStaticSftpConnection() {
        try {
            logger.info("初始化SFTP实体对象");
            CrlSftpVo crlSftp = new CrlSftpVo();
            crlSftp.setHost(getHost());
            crlSftp.setPort(Integer.parseInt(getPort()));
            crlSftp.setUsername(getUsername());
            crlSftp.setPassword(getPassword());
            crlSftp.setPrivateKeyFile(getPrivateKeyFile());
            sftpUtil = buildSftpUtil(crlSftp);
            logger.info("初始化SFTP实体对象，完成");
            return sftpUtil;
        } catch (Exception e) {
            logger.error("初始化SFTP实体对象发生异常：{}", e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    public void closeSftpConnection() {
        getSftpUtil().disconnect();
        setSftpUtil(null);
    }
}
